package sgc;

import java.util.Arrays;
import java.util.Calendar;

/**
 * @author Diego Pereira do Nascimento e Leonardo Santos Martins
 * 
 * Descrição da classe::
 * Está classe tem como propósito ser utilizada para as incrições dos candidatos nos concursos
 *  
 */
public class Inscricao {
    
    public Candidato candidato;
    public Concurso concurso;
    public String gabarito[];
    public Calendar dataInsc;
    public boolean paga;
    public double nota;

    public Inscricao(Candidato cand, Concurso conc, String[] gab, Calendar data, boolean paga, double n) {
        this.candidato = cand;
        this.concurso = conc;
        this.gabarito = gab;
        this.dataInsc = data;
        this.paga = paga;
        this.nota = n;
    }
    
    // Gets e Sets
    public Candidato getCandidato() {
        return candidato;
    }

    public void setCandidato(Candidato cand) {
        this.candidato = cand;
    }

    public Concurso getConcurso() {
        return this.concurso;
    }

    public void setConcurso(Concurso conc) {
        this.concurso = conc;
    }

    public String[] getGabarito() {
        return this.gabarito;
    }

    public void setGabarito(String[] gab) {
        this.gabarito = gab;
    }

    public Calendar getDataInsc() {
        return this.dataInsc;
    }

    public void setDataInsc(Calendar data) {
        this.dataInsc = data;
    }

    public boolean getPaga() {
        return this.paga;
    }

    public void setPaga(boolean paga) {
        this.paga = paga;
    }

    public double getNota() {
        return nota;
    }

    public void setNota(double n) {
        this.nota = n;
    }

    @Override
    public String toString() {
        String p = this.paga == true ? "Sim" : "Não";
        return "\nCandidato: " + this.candidato + "\nConcurso=" + this.concurso + "\nGabarito: " + Arrays.toString(this.gabarito) + "\nData de Inscrição: " + this.dataInsc + "\nEstá pago: " + p + "\nNota: " + this.nota;
    }
    
    public static Inscricao criar(Candidato cand[], Concurso conc[]){
        int ano, mes, dia, cod, posi = Integer.MIN_VALUE, posiC = Integer.MIN_VALUE;
        Leitura ler = new Leitura();
        String aux, gab[] = new String[5];
        Calendar data = Calendar.getInstance();
        boolean p;
        double n;
        
        // Verifica se é um candidato existente
        do{
            System.out.println("Digite o código do candidato: ");
            cod = ler.lerInt();
            for(int i = 0; cand[i] != null; i++)
                if(cod == cand[i].getCod())
                    posiC = i;
            if(posiC == Integer.MIN_VALUE)
                System.out.println("Candidato não encontrado!");
        }while(posiC == Integer.MIN_VALUE);
        
        // Verifica se é um concurso existente
        do{
            int i;
            
            // Exibe o título de todos os concursos cadastrados e sua datas
            for(i = 0; conc[i] != null; i++)
                System.out.println("Código: " + (i + 1) + "\nTítulo: " + conc[i].getTitulo());
                
            if(i == 0){
                System.out.println("Não há Concursos cadastrados!");
                System.exit(1);
            }else{
                System.out.println("Digite o código do concurso: ");
                cod = ler.lerInt();
                
                for(i = 0; conc[i] != null; i++)
                    if(cod == (i + 1))
                        posi = i;
            }
        }while(posi == Integer.MIN_VALUE);
        
        // Pede para o usuário digitar o seu gabarito
        for(int i = 0; i < 5; i++){  
            System.out.println("Digite a " + (i + 1) + "ª resposta: ");
            gab[i] = ler.lerString();
        }
        
        // Recebe a data da inscrição dretamente da sistema
        dia = data.get(Calendar.DAY_OF_WEEK);// Pega o dia do mes
        mes = data.get(Calendar.MONTH);// Pega o mes
        ano = data.get(Calendar.YEAR);// Pega o ano
        
        data.set(ano, mes, dia);
        
        System.out.println("Digite a nota: ");
        n = ler.lerDouble();
        
        System.out.println("Digite se 'S' se a inscrição está paga ou 'N' caso não esteja: ");
        aux = ler.lerString();
        
        p = aux.equalsIgnoreCase("s");
        
        Inscricao insc = new Inscricao(cand[posi], conc[posiC], gab, data, p, n);
        
        return insc;
    }
    
    public static boolean excluir(Inscricao[] insc){
        Leitura ler = new Leitura();
        int cod;
        
        System.out.println("Digite o código do candidato: ");
        cod = ler.lerInt();
        
        // Arrumar esta parte abaixo
        for(int i = 0; insc[i] != null; i++){
            if(insc[i].getCandidato().getCod() == cod){
                if(i < insc.length){
                    for(int j = i; j < (insc.length - 1); j++)
                        insc[j] = insc[j + 1]; //Substitui o valor da posição atual pela próxima posição
                    // A última posição do laço recebe null
                    insc[(insc.length - 1)] = null;
                }else
                    insc[i + 1] = null;
                
                return  true;
            }
        }
        System.out.println("Candidato não encontrado!");
        
        return false;
    }
    
    public void corrigirGabarito(){
        boolean pCorr[] = new boolean[this.gabarito.length];
        Questao quest[] = this.concurso.getQuestoes();
        String aux;
        
        // Verifica se a questão está correta ou não
        // Questões corretas recebem true, incorretas false
        for(int i = 0; i < this.gabarito.length; i++)
            pCorr[i] = quest[i].corrigir(this.gabarito[i]);
        
        // Exibe quais questões estão corretas e quais estão incorretas
        for(int i = 0; i < pCorr.length; i++)
            System.out.println("Questão " + (i + 1) + ": " + (pCorr[i] == true ? "Correta" : "Incorreta"));
    }
    
}
